/**
 * 后台用户表
 * 可以添加多个能登录后台的用户
 */

import bcrypt from 'bcrypt';

const adminUser = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;
  const AdminUser = app.model.define(
    'adminUser',
    {
      id: { type: INTEGER, primaryKey: true, autoIncrement: true },
      username: {
        type: STRING,
        unique: true,
        allowNull: false,
        validate: {
          notEmpty: { args: true, msg: '用户名必填' },
          len: { args: [2, 20], msg: '用户名需要在2到20位之间' }
        }
      },
      avatar: {
        type: STRING,
        unique: false,
        allowNull: true
      },
      email: {
        type: STRING,
        unique: true,
        allowNull: false,
        validate: {
          notEmpty: { args: true, msg: '邮箱必填' },
          isEmail: { args: true, msg: '邮箱格式不合法' }
        }
      },
      password: {
        type: STRING,
        allowNull: false,
        validate: {
          notEmpty: { args: true, msg: '密码必填' }
        }
      },
      creator: {
        type: STRING,
        unique: false,
        allowNull: true
      },
      created_at: DATE,
      updated_at: DATE
    },
    {
      freezeTableName: true, // 自定义表名
      tableName: 'admin_users',
      timestamps: true, // 是否需要增加createdAt、updatedAt、deletedAt字段
      underscored: true // 字段使用下划线，而不是驼峰式命名
      // 'paranoid': true // 设置paranoid为true（此种模式下，删除数据时不会进行物理删除，而是设置deletedAt为当前时间
    }
  );

  // 模型关系
  // AdminUser.associate = models => {
  // AdminUser.belongsTo(models.AdminRole, { foreignKey: 'role_id', targetKey: 'id', as: 'role' });
  // };

  // hook函数，在创建用户之前加密用户
  AdminUser.beforeCreate(async user => {
    user.password = await user.generatePasswordHash();
  });

  // 加密存储用户密码
  AdminUser.prototype.generatePasswordHash = async function () {
    const saltRounds = 12;
    return await bcrypt.hash(this.password, saltRounds);
  };

  // 验证用户密码
  AdminUser.prototype.validatePassword = async function (password) {
    return await bcrypt.compare(password, this.password);
  };

  return AdminUser;
};

export default adminUser;
